package ejb.cbm.operatoria.session;

import java.util.List;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import ejb.cbm.operatoria.entity.CuentaEntity;
import ejb.cbm.operatoria.local.CuentaSessionLocal;

////@Stateless
public class CuentaSession extends HibernateDaoSupport implements CuentaSessionLocal {
	
	static Logger logger = Logger.getLogger(CuentaSession.class.getName());
	
	//property constants
	public static final String CODIGOCENTROALTA = "codigocentroalta";
	public static final String NUMEROCUENTA = "numerocuenta";
	public static final String DIGITOCONTROL1 = "digitocontrol1";
	public static final String DIGITOCONTROL2 = "digitocontrol2";
	public static final String TIPOREGISTRO = "tiporegistro";
	public static final String CODIGOPRODUCTO = "codigoproducto";
	public static final String CODIGOSUBPRODUCTO = "codigosubproducto";
	public static final String CODIGODIVISA = "codigodivisa";
	public static final String CODIGOCENTROCUENTA = "codigocentrocuenta";
	public static final String CODCENTROCONTABLE = "codcentrocontable";
	public static final String SALDODISPONIBLE = "saldodisponible";
	public static final String SALDOCONTABLE = "saldocontable";
	public static final String INDICADORTARIFA = "indicadortarifa";
	public static final String CODIGOTARIFA = "codigotarifa";
	public static final String INDICADORACEPTACTA = "indicadoraceptacta";
	public static final String INDICADORSITUACIONCTA = "indicadorsituacioncta";
	public static final String INDICADORCONDICIONCTA = "indicadorcondicioncta";
	public static final String USUARIOREGISTRO = "usuarioregistro";
	public static final String USUARIOMODIFICACION = "usuariomodificacion";


    //@PersistenceContext 
	//private EntityManager entityManager;
	
	@Autowired
	public CuentaSession(SessionFactory sessionFactory){
		super.setSessionFactory(sessionFactory);
	}
	
    public void save(CuentaEntity transientInstance) {
    	logger.log("saving CuentaEntity instance", Level.INFO, null,null);
        try {
            getSession().persist(transientInstance);
            logger.log("save successful", Level.INFO, null,null);
        } catch (RuntimeException re) {
        	logger.log("save failed", Level.FATAL,null, re);
            throw re;
        }
    }
    
    public void delete(CuentaEntity persistentInstance) {
    	logger.log("deleting CuentaEntity instance", Level.INFO, null,null);
        try {
            getSession().delete(persistentInstance);
            logger.log("delete successful", Level.INFO, null,null);
        } catch (RuntimeException re) {
        	logger.log("delete failed", Level.FATAL,null, re);
            throw re;
        }
    }
    
    public CuentaEntity update(CuentaEntity detachedInstance) {
    	logger.log("updating CuentaEntity instance", Level.INFO, null,null);
        try {
            CuentaEntity result = (CuentaEntity) getSession().merge(detachedInstance);
            logger.log("update successful", Level.INFO, null,null);
            return result;
        } catch (RuntimeException re) {
        	logger.log("update failed", Level.FATAL,null, re);
            throw re;
        }
    }
    
    public CuentaEntity findById( Long id) {
    	logger.log("finding CuentaEntity instance with id: " + id, Level.INFO, null,null);
        try {
            CuentaEntity instance = (CuentaEntity) getSession().get(CuentaEntity.class, id);
            return instance;
        } catch (RuntimeException re) {
        	logger.log("find failed", Level.FATAL,null, re);
            throw re;
        }
    }
    
    //@SuppressWarnings("unchecked")
    public List<CuentaEntity> findByProperty(String propertyName, Object value) {
    	logger.log("finding CuentaEntity instance with property: " + propertyName
    						+ ", value: " + value, Level.INFO, null,null);
		try {
			String queryString = "select model from CuentaEntity model where model." 
			 						+ propertyName + "= :propertyValue";
			return getSession().createQuery(queryString)
 				.setParameter("propertyValue", value).list();
		} catch (RuntimeException re) {
			logger.log("find by property name failed", Level.FATAL,null, re);
			throw re;
		}
	}
	
	public List<CuentaEntity> findByCodigocentroalta(Object codigocentroalta) {
		return findByProperty(CODIGOCENTROALTA, codigocentroalta);
	}
	
	public List<CuentaEntity> findByNumerocuenta(Object numerocuenta) {
		return findByProperty(NUMEROCUENTA, numerocuenta);
	}
	
	public List<CuentaEntity> findByDigitocontrol1(Object digitocontrol1) {
		return findByProperty(DIGITOCONTROL1, digitocontrol1);
	}
	
	public List<CuentaEntity> findByDigitocontrol2(Object digitocontrol2) {
		return findByProperty(DIGITOCONTROL2, digitocontrol2);
	}
	
	public List<CuentaEntity> findByTiporegistro(Object tiporegistro) {
		return findByProperty(TIPOREGISTRO, tiporegistro);
	}
	
	public List<CuentaEntity> findByCodigoproducto(Object codigoproducto) {
		return findByProperty(CODIGOPRODUCTO, codigoproducto);
	}
	
	public List<CuentaEntity> findByCodigosubproducto(Object codigosubproducto) {
		return findByProperty(CODIGOSUBPRODUCTO, codigosubproducto);
	}
	
	public List<CuentaEntity> findByCodigodivisa(Object codigodivisa) {
		return findByProperty(CODIGODIVISA, codigodivisa);
	}
	
	public List<CuentaEntity> findByCodigocentrocuenta(Object codigocentrocuenta) {
		return findByProperty(CODIGOCENTROCUENTA, codigocentrocuenta);
	}
	
	public List<CuentaEntity> findByCodcentrocontable(Object codcentrocontable) {
		return findByProperty(CODCENTROCONTABLE, codcentrocontable);
	}
	
	public List<CuentaEntity> findBySaldodisponible(Object saldodisponible) {
		return findByProperty(SALDODISPONIBLE, saldodisponible);
	}
	
	public List<CuentaEntity> findBySaldocontable(Object saldocontable) {
		return findByProperty(SALDOCONTABLE, saldocontable);
	}
	
	public List<CuentaEntity> findByIndicadortarifa(Object indicadortarifa) {
		return findByProperty(INDICADORTARIFA, indicadortarifa);
	}
	
	public List<CuentaEntity> findByCodigotarifa(Object codigotarifa) {
		return findByProperty(CODIGOTARIFA, codigotarifa);
	}
	
	public List<CuentaEntity> findByIndicadoraceptacta(Object indicadoraceptacta) {
		return findByProperty(INDICADORACEPTACTA, indicadoraceptacta);
	}
	
	public List<CuentaEntity> findByIndicadorsituacioncta(Object indicadorsituacioncta) {
		return findByProperty(INDICADORSITUACIONCTA, indicadorsituacioncta);
	}
	
	public List<CuentaEntity> findByIndicadorcondicioncta(Object indicadorcondicioncta) {
		return findByProperty(INDICADORCONDICIONCTA, indicadorcondicioncta);
	}
	
	public List<CuentaEntity> findByUsuarioregistro(Object usuarioregistro) {
		return findByProperty(USUARIOREGISTRO, usuarioregistro);
	}
	
	public List<CuentaEntity> findByUsuariomodificacion(Object usuariomodificacion) {
		return findByProperty(USUARIOMODIFICACION, usuariomodificacion);
	}
	

	//@SuppressWarnings("unchecked")
	public List<CuentaEntity> findAll() {
		logger.log("finding all CuentaEntity instances", Level.INFO, null,null);
		try {
			String queryString = "select model from CuentaEntity model";
			return getSession().createQuery(queryString).list();
		} catch (RuntimeException re) {
			logger.log("find all failed", Level.FATAL,null, re);
			throw re;
		}
	}
}